package arithmetic.leetCode;

import arithmetic.geektime.tree.TreeNode;

/**
 * @author dycong
 * @date 2019/10/12 8:58
 */
public class LowestCommonAncestor_236 {

    /**
     * 二叉树的最近公共父亲节点
     * <p>
     * <p>
     * 从根节点开始遍历，如果node1和node2中的任一个和root匹配，那么root就是最低公共祖先。
     * 如果都不匹配，则分别递归左、右子树，如果有一个 节点出现在左子树，并且另一个节点出现在右子树，则root就是最低公共祖先.
     * 如果两个节点都出现在左子树，则说明最低公共祖先在左子树中，否则在右子树。
     *
     * @param root
     * @param p
     * @param q
     * @return
     */
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {

        //从根节点开始遍历，如果node1和node2中的任一个和root匹配，那么root就是最低公共祖先。
        if (root == null || root == p || root == q) return root;
        //查看左子树中是否有目标结点，没有为null
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        //查看右子树是否有目标节点，没有为null
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        //都不为空，说明做右子树都有目标结点，则公共祖先就是本身
        if (null != left && null != right) return root;
        //如果发现了目标节点，则继续向上标记为该目标节点
        return left == null ? right : left;
    }
}
